# function 函数
'''
def 函数名(参数1,参数2,参数3......):
....函数体
....函数体
....函数体
....return 返回值
'''


# 定义一个平方函数，输入x 返回x的平方
# 输入参数：x x必须是数值型的
# 返回值：x的平方
def square(x):
    # 判断x的类型
    # isinstance(value,类型) 判断value是否为指定的类型
    if isinstance(x, int) or isinstance(x, float):
        return x * x
    elif isinstance(x, str):
        if x.isnumeric():  # 判断字符串是否为数字
            return float(x) ** 2
    else:
        return 0


# 函数的调用
# 函数名(参数)
print(square(2))
print(square(4))
print(square(10))
print(square(8))


# 计算1~n的和
def func1(n):
    if n <= 1:  # 如果n小于等于1直接返回
        return 0
    sum = 0
    count = 1
    while count <= n:  # 使用while循环计算1~n的和
        sum += count
        count += 1
    return sum


print(func1(100))


# 求n的阶乘
# n! = n * (n-1) * (n-1) * ...... * 1
# 第一种方式：使用while循环
def jieCheng1(n):
    if n <= 1:
        return 1
    result = 1
    count = 1
    while count <= n:
        result *= count
        count += 1
    return result


print(jieCheng1(5))


# 第二种方式：使用递归函数
# 递归函数：1、自己调用自己 2、有停止条件
# 尽量避免使用递归函数，能用循环实现 尽量用循环
def jieCheng2(n):
    if n == 1:
        return 1
    return n * jieCheng2(n - 1)


print(jieCheng2(1))
print(jieCheng2(3))
print(jieCheng2(5))
'''
jieCheng2(5)->5*jieCheng2(4)
                    -> 4*jieCheng2(3)
                            ->3*jieCheng2(2)
                                    ->2*jieCheng2(1)
                                            ->1
'''
# print(jieCheng1(100000))  # while 循环
# print(jieCheng2(900))  # 递归 有上限 默认1000
import sys

print(sys.getrecursionlimit())  # 获取递归次数上限值
sys.setrecursionlimit(1000)  # 手动设置递归次数的上限


# lambda表达式
# 语法：   lambda 输入参数(多个用逗号隔开):返回值
# 简化版的函数
# 求 x的n次方

def ciFang(x, n=2):
    return x ** n


print(ciFang(2))
ciFang2 = lambda x, n: x ** n

print(ciFang(2, 3))
print(ciFang2(2, 3))

list1 = [(1, 5), (4, 2), (3, 3), (2, 4), (5, 1)]
print(list1)
list1.sort()
print(list1)
list1.sort(key=lambda tuple1: tuple1[1])
print(list1)
